home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / impacket / dcerpc / epm.py < prev    next >
Text File  |  2006-05-23  |  7KB  |  215 lines

  1. # Copyright (c) 2003-2006 CORE Security Technologies
  2. #
  3. # This software is provided under under a slightly modified version
  4. # of the Apache Software License. See the accompanying LICENSE file
  5. # for more information.
  6. #
  7. # $Id: epm.py,v 1.5 2006/05/23 21:19:26 gera Exp $
  8. #
  9.  
  10. import array
  11. import struct
  12.  
  13. from impacket import ImpactPacket
  14. from impacket import uuid
  15. import dcerpc
  16. import ndrutils
  17. import transport
  18.  
  19. MSRPC_UUID_PORTMAP ='\x08\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa\x03\x00\x00\x00'
  20.  
  21. class EPMLookupRequestHeader(ImpactPacket.Header):
  22.     OP_NUM = 2
  23.  
  24.     __SIZE = 76
  25.  
  26.     def __init__(self, aBuffer = None, endianness = '<'):
  27.         ImpactPacket.Header.__init__(self, EPMLookupRequestHeader.__SIZE)
  28.         self.endianness = endianness
  29.  
  30.         self.set_inquiry_type(0)
  31.         self.set_referent_id(1)
  32.         self.set_referent_id2(2)
  33.         self.set_max_entries(1)
  34.  
  35.         if aBuffer: self.load_header(aBuffer)
  36.  
  37.     def get_inquiry_type(self):
  38.         return self.get_long(0, self.endianness)
  39.     def set_inquiry_type(self, type):
  40.         self.set_long(0, type, self.endianness)
  41.  
  42.     def get_referent_id(self):
  43.         return self.get_long(4, self.endianness)
  44.     def set_referent_id(self, id):
  45.         self.set_long(4, id, self.endianness)
  46.  
  47.     def get_obj_binuuid(self):
  48.         return self.get_bytes().tolist()[8:8+16]
  49.     def set_obj_binuuid(self, binuuid):
  50.         assert 16 == len(binuuid)
  51.         self.get_bytes()[8:8+16] = array.array('B', binuuid)
  52.  
  53.     def get_referent_id2(self):
  54.         return self.get_long(24, self.endianness)
  55.     def set_referent_id2(self, id):
  56.         self.set_long(24, id, self.endianness)
  57.  
  58.     def get_if_binuuid(self):
  59.         return self.get_bytes().tolist()[28:28+20]
  60.     def set_if_binuuid(self, binuuid):
  61.         assert 20 == len(binuuid)
  62.         self.get_bytes()[28:28+20] = array.array('B', binuuid)
  63.  
  64.     def get_version_option(self):
  65.         return self.get_long(48, self.endianness)
  66.     def set_version_option(self, opt):
  67.         self.set_long(48, opt, self.endianness)
  68.  
  69.     def get_handle(self):
  70.         return self.get_bytes().tolist()[52:52+20]
  71.     def set_handle(self, handle):
  72.         assert 20 == len(handle)
  73.         self.get_bytes()[52:52+20] = array.array('B', handle)
  74.  
  75.     def get_max_entries(self):
  76.         return self.get_long(72, self.endianness)
  77.     def set_max_entries(self, num):
  78.         self.set_long(72, num, self.endianness)
  79.  
  80.  
  81.     def get_header_size(self):
  82.         return EPMLookupRequestHeader.__SIZE
  83.  
  84.  
  85. class EPMRespLookupRequestHeader(ImpactPacket.Header):
  86.     __SIZE = 28
  87.  
  88.     def __init__(self, aBuffer = None):
  89.         ImpactPacket.Header.__init__(self, EPMRespLookupRequestHeader.__SIZE)
  90.         if aBuffer: self.load_header(aBuffer)
  91.  
  92.     def get_handle(self):
  93.         return self.get_bytes().tolist()[0:0+20]
  94.     def set_handle(self, handle):
  95.         assert 20 == len(handle)
  96.         self.get_bytes()[0:0+20] = array.array('B', handle)
  97.  
  98.     def get_entries_num(self):
  99.         return self.get_long(20, '<')
  100.     def set_entries_num(self, num):
  101.         self.set_long(20, num, '<')
  102.  
  103.     def get_entry(self):
  104.         return ndrutils.NDREntries(self.get_bytes().tostring()[24:-4])
  105.     def set_entry(self, entry):
  106.         raise Exception, "method not implemented"
  107.  
  108.     def get_status(self):
  109.         off = self.get_entry().get_entries_len()
  110.         return self.get_long(24 + off, '<')
  111.     def set_status(self, status):
  112.         off = self.get_entry().get_entries_len()
  113.         self.set_long(24 + off, status, '<')
  114.  
  115.  
  116.     def get_header_size(self):
  117.         entries_size = self.get_entry().get_entries_len()
  118.         return EPMRespLookupRequestHeader.__SIZE + entries_size
  119.  
  120.  
  121. class DCERPCEpm:
  122.     endianness = '<'
  123.     def __init__(self, dcerpc):
  124.         self._dcerpc = dcerpc
  125.  
  126.     def portmap_dump(self, rpc_handle = '\x00'*20):
  127.         if self.endianness == '>':
  128.             from impacket.structure import unpack,pack
  129.             try:
  130.                 rpc_handle = ''.join(map(chr, rpc_handle))
  131.             except:
  132.                 pass
  133.             
  134.             uuid = list(unpack('<LLHHBB6s', rpc_handle))
  135.             rpc_handle = pack('>LLHHBB6s', *uuid)
  136.  
  137.         lookup = EPMLookupRequestHeader(endianness = self.endianness)
  138.         lookup.set_handle(rpc_handle);
  139.         self._dcerpc.send(lookup)
  140.  
  141.         data = self._dcerpc.recv()
  142.         resp = EPMRespLookupRequestHeader(data)
  143.  
  144.         return resp
  145.  
  146. class EpmEntry:
  147.     def __init__(self, uuid, version, annotation, objuuid, protocol, endpoint):
  148.         self.__uuid = uuid
  149.         self.__version = version
  150.         self.__annotation = annotation
  151.         self.__objuuid = objuuid
  152.         self.__protocol = protocol
  153.         self.__endpoint = endpoint
  154.  
  155.     def getUUID(self):
  156.         return self.__uuid
  157.  
  158.     def setUUID(self, uuid):
  159.         self.__uuid = uuid
  160.  
  161.     def getProviderName(self):
  162.         return ndrutils.uuid_to_exe(uuid.string_to_bin(self.getUUID()) + struct.pack('<H', self.getVersion()))
  163.  
  164.     def getVersion(self):
  165.         return self.__version
  166.  
  167.     def setVersion(self, version):
  168.         self.__version = version
  169.  
  170.     def isZeroObjUUID(self):
  171.         return self.__objuuid == '00000000-0000-0000-0000-000000000000'
  172.  
  173.     def getObjUUID(self):
  174.         return self.__objuuid
  175.  
  176.     def setObjUUID(self, objuuid):
  177.         self.__uuid = objuuid
  178.  
  179.     def getAnnotation(self):
  180.         return self.__annotation
  181.  
  182.     def setAnnotation(self, annotation):
  183.         self.__annotation = annotation
  184.  
  185.     def getProtocol(self):
  186.         return self.__protocol
  187.  
  188.     def setProtocol(self, protocol):
  189.         self.__protocol = protocol
  190.  
  191.     def getEndpoint(self):
  192.         return self.__endpoint
  193.  
  194.     def setEndpoint(self, endpoint):
  195.         self.__endpoint = endpoint
  196.  
  197.     def __str__(self):
  198.         stringbinding = transport.DCERPCStringBindingCompose(self.getObjUUID(), self.getProtocol(), '', self.getEndpoint())
  199.         s = '['
  200.         if self.getAnnotation(): s += "Annotation: \"%s\", " % self.getAnnotation()
  201.         s += "UUID=%s, version %d, %s]" % (self.getUUID(), self.getVersion(), stringbinding)
  202.  
  203.         return s
  204.  
  205.     def __cmp__(self, o):
  206.         if (self.getUUID() == o.getUUID()
  207.             and self.getVersion() == o.getVersion()
  208.             and self.getAnnotation() == o.getAnnotation()
  209.             and self.getObjUUID() == o.getObjUUID()
  210.             and self.getProtocol() == o.getProtocol()
  211.             and self.getEndpoint() == o.getEndpoint()):
  212.             return 0
  213.         else:
  214.             return -1 # or +1, for what we care.
  215.